package cn.iocoder.yudao.module.scrm.dal.dataobject.customer;

import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.module.scrm.annotations.DictField;
import cn.iocoder.yudao.module.scrm.controller.admin.commom.vo.FileInfoVO;
import cn.iocoder.yudao.module.scrm.dal.dataobject.receivable.ReceivableDO;
import cn.iocoder.yudao.module.scrm.enums.DictTypeConstants;
import cn.iocoder.yudao.module.scrm.framework.operatelog.core.ScrmCustomerStageFunction;
import cn.iocoder.yudao.module.scrm.framework.operatelog.core.ScrmReceivableMethodFunction;
import cn.iocoder.yudao.module.scrm.framework.operatelog.core.ScrmSonCompanyFunction;
import cn.iocoder.yudao.module.scrm.framework.operatelog.core.ScrmYearTurnoverFunction;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import com.mzt.logapi.starter.annotation.DiffLogField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;

import java.math.BigDecimal;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.Digits;

import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
import static cn.iocoder.yudao.module.scrm.enums.DictTypeConstants.*;
import static cn.iocoder.yudao.module.scrm.enums.DictTypeConstants.SCRM_PAYMENT_METHOD;

/**
 * SCRM客户 DO
 *
 * @author admin
 */
@TableName(value = "scrm_customer", autoResultMap = true)
@KeySequence("scrm_customer_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库，可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CustomerDO extends BaseDO {

    /**
     * 主键
     */
    @TableId
    private Long id;
    /**
     * 客户名称
     */
    private String name;
    /**
     * 企业
     */
    private String enterprise;
    /**
     * 电话
     */
    private String phone;
    /**
     * 线索来源
     */
    private String clueSource;
    /**
     * 获客时间
     */
    private LocalDateTime customerSourceTime;
    /**
     * 客户来源
     */
    private String customerSource;
    /**
     * 素材来源
     */
    private String materialSource;
    /**
     * 信息来源
     */
    private String infoSource;
    /**
     * 客户质量-》客户意向
     */
    private String clientQuality;
    /**
     * 备注
     */
    private String remark;
    /**
     * 扩展
     */
    private String extend;
    /**
     * 跟进状态
     */
    private Boolean followUpStatus;
    /**
     * 最后跟进时间
     */
    private LocalDateTime contactLastTime;
    /**
     * 最后跟进内容
     */
    private String contactLastContent;
    /**
     * 下次联系时间
     */
    private LocalDateTime contactNextTime;
    /**
     * 负责人的用户编号
     */
    private Long ownerUserId;
    /**
     * 成为负责人的时间
     */
    private LocalDateTime ownerTime;
    /**
     * 成交状态
     */
    private Boolean dealStatus;
    /**
     * 锁定状态
     */
    private Boolean lockStatus;
    /**
     * 客户等级，对应字典 SCRM_CUSTOMER_LEVEL
     */
    private Integer level;
    /**
     * 状态
     */
    private Integer status;




    /**
     * 客户阶段
     */
    private String customerStage;

    /**
     * 年营业额
     */
    private String yearTurnover;

    /**
     * 分公司
     */
    private String sonCompany;

    /**
     * 回款方式
     */
    private String receivableMethod;

    /**
     * 职位
     */
    private String position;

    /**
     * 身份证号
     */
    private String idCard;

    /**
     * 邀约人
     */
    private String inviter;

    /**
     * 回款金额
     */
    private BigDecimal receivablePrice;

    /**
     * 回款时间
     */
    private LocalDateTime receivableTime;

    /**
     * 峰会是否签到
     */
    private Integer summitStatus;

    /**
     * 峰会组别
     */
    private String summitGroup;

    /**
     * 员工人数
     */
    private String numberPeople;

    /**
     * 需求及痛点
     */
    private String quantityPain;

    /**
     * 图片-附件信息
     */
    @TableField(typeHandler = FileInfoHandler.class)
    private List<FileInfoVO> pictureAttachment;

    /**
     * 附件信息
     */
    @TableField(typeHandler = FileInfoHandler.class)
    private List<FileInfoVO> attachment;





    public static class FileInfoHandler extends AbstractJsonTypeHandler<List<FileInfoVO>> {

        @Override
        protected List<FileInfoVO> parse(String json) {
            return JsonUtils.parseArray(json, FileInfoVO.class);
        }

        @Override
        protected String toJson(List<FileInfoVO> obj) {
            return JsonUtils.toJsonString(obj);
        }

    }

}